package portal.servicios;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

import javax.ejb.EJB;
import javax.ejb.Stateless;

import org.jboss.logging.Logger;

import portal.dao.ArticuloDAO;
import portal.dao.DAO;
import portal.entidades.Articulo;
import portal.entidades.ArticuloElectrodomestico;
import portal.entidades.ArticuloInfantil;
import portal.entidades.ArticuloModa;
import portal.entidades.ArticuloMueble;
import portal.entidades.RankingArticulo;
import portal.entidades.Resultado;

@Stateless
public class ArticuloServiceBean extends DAO implements ArticuloService {

	@EJB
	private ArticuloDAO articuloDAO;
	
	private static Logger logger = Logger.getLogger(ArticuloServiceBean.class);

	public ArticuloServiceBean() {

	}

	@Override
	public List<Articulo> listarArticulos() {
		return articuloDAO.listarArticulos();
	}

	@Override
	public List<Articulo> listarArticlosBetSellers() {
		return articuloDAO.listarArticlosBetSellers();
	}

	@Override
	public Resultado actualizarRanking(List<RankingArticulo> ranking) {
		logger.info("######## actualizarRanking START ########");
		Resultado resultado = new Resultado();

		// Array de error
		List<RankingArticulo> errores = new ArrayList<RankingArticulo>();
		// Articulos validados
		HashMap<Articulo, Integer> articulos = new HashMap<Articulo, Integer>();

		// Verifico cada articulo
		for (RankingArticulo rankingArticulo : ranking) {
			Articulo articulo = buscarPorCodigo(rankingArticulo
					.getCodigoArticulo());
			// Articulo inexistente
			if (articulo == null)
				errores.add(rankingArticulo);
			else
				articulos.put(articulo, rankingArticulo.getPosicion());
		}

		// Si hubo errores
		if (errores.size() > 0) {
			String mensaje = "No se ejecuto el servicio. Los siguientes articulos son inexistentes: ";
			for (RankingArticulo rankingArticulo : errores) {
				mensaje = mensaje + rankingArticulo.getCodigoArticulo() + " ";
			}
			resultado.setErrorConMensaje(mensaje);
			logger.info(resultado.getMensaje());
			return resultado;
		}

		// Si no hubo errores blanqueo ranking
		articuloDAO.blanquearRankings();
		// Luego actualizo el ranking
		for (Articulo articulo : articulos.keySet()) {
			articulo.setRanking(articulos.get(articulo));
			articuloDAO.actualizar(articulo);
		}
		resultado.setOkConMensaje("Se actualizaron los best sellers");
		logger.info(resultado.getMensaje());
		return resultado;
	}

	@Override
	public Articulo buscarPorCodigo(Long codigoProducto) {
		List<Articulo> articulos = articuloDAO.buscarPorCodigo(codigoProducto);
		return (articulos.size() == 0 ? null : articulos.get(0));
	}

	@Override
	public void crearArticuloMueble(ArticuloMueble articulo) {
		// TODO Auto-generated method stub
		articuloDAO.crearArticuloMueble(articulo);
	}

	@Override
	public void crearArticuloModa(ArticuloModa articulo) {
		articuloDAO.crearArticuloModa(articulo);

	}

	@Override
	public void crearArticuloElectro(ArticuloElectrodomestico articulo) {
		articuloDAO.crearArticuloElectro(articulo);
	}

	@Override
	public void crearArticuloInfantil(ArticuloInfantil articulo) {
		articuloDAO.crearArticuloInfantil(articulo);
	}

	@Override
	public void actualizarArticuloMueble(ArticuloMueble articulo) {
		articuloDAO.actualizarArticuloMueble(articulo);
	}

	@Override
	public void actualizarArticuloModa(ArticuloModa articulo) {
		articuloDAO.actualizarArticuloModa(articulo);
	}

	@Override
	public void actualizarArticuloElectro(ArticuloElectrodomestico articulo) {
		articuloDAO.actualizarArticuloElectro(articulo);
	}

	@Override
	public void actualizarArticuloInfantil(ArticuloInfantil articulo) {
		articuloDAO.actualizarArticuloInfantil(articulo);
	}

}
